---------------------------------------------------------------------------------
--
-- Prat - A framework for World of Warcraft chat mods
--
-- Copyright (C) 2006-2011  Prat Development Team
--
-- This program is free software; you can redistribute it and/or
-- modify it under the terms of the GNU General Public License
-- as published by the Free Software Foundation; either version 2
-- of the License, or (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program; if not, write to:
--
-- Free Software Foundation, Inc., 
-- 51 Franklin Street, Fifth Floor, 
-- Boston, MA  02110-1301, USA.
--
--
-------------------------------------------------------------------------------

Prat:AddModuleToLoad(function()

  local PRAT_MODULE = Prat:RequestModuleName("PlayerNames")

  if PRAT_MODULE == nil then
    return
  end

  -- define localized strings
  local L = Prat:GetLocalizer({})

  --[===[@debug@
  L:AddLocale("enUS", {
    ["PlayerNames"] = true,
    ["Player name formating options."] = true,
    ["Brackets"] = true,
    ["Square"] = true,
    ["Angled"] = true,
    ["None"] = true,
    ["Class"] = true,
    ["Random"] = true,
    ["Reset Settings"] = true,
    ["No additional coloring"] = true,
    ["Restore default settings, and delete stored character data."] = true,
    ["Sets style of brackets to use around player names."] = true,
    ["Unknown Use Common Color"] = true,
    ["Toggle using a common color for unknown player names."] = true,
    ["Unknown Common Color"] = true,
    ["Set common color of unknown player names."] = true,
    ["Enable TabComplete"] = true,
    ["Toggle tab completion of player names."] = true,
    ["Show Level"] = true,
    ["Toggle level showing."] = true,
    ["Level Color Mode"] = true,
    ["Use Player Color"] = true,
    ["Use Channel Color"] = true,
    ["Color by Level Difference"] = true,
    ["How to color other player's level."] = true,
    ["Show Group"] = true,
    ["Toggle raid group showing."] = true,
    ["Show Raid Target Icon"] = true,
    ["Toggle showing the raid target icon which is currently on the player."] = true,
    ["Use toon name for RealID"] = true,

    -- In the high-cpu pullout
    ["coloreverywhere_name"] = "Color Names Everywhere",
    ["coloreverywhere_desc"] = "Color player names if they appear in the text of the chat message",
    ["hoverhilight_name"] = "Hover Hilighting",
    ["hoverhilight_desc"] = "Hilight chat lines from a specific player when hovering over thier playerlink",
    ["realidcolor_name"] = "RealID Coloring",
    ["realidcolor_desc"] = "RealID Name Coloring",
    ["Keep Info"] = true,
    ["Keep Lots Of Info"] = true,
    ["Keep player information between session for all players except cross-server players"] = true,
    ["Keep player information between session, but limit it to friends and guild members."] = true,
    ["Player Color Mode"] = true,
    ["How to color player's name."] = true,
    ["Unknown Common Color From TasteTheNaimbow"] = true,
    ["Let TasteTheNaimbow set the common color for unknown player names."] = true,
    ["Enable Alt-Invite"] = true,
    ["Toggle group invites by alt-clicking on player name."] = true,
    ["Enable Invite Links"] = true,
    ["Toggle group invites by alt-clicking hyperlinked keywords like 'invite'."] = true,
    ["Brackets Common Color"] = true,
    ["Sets common color of brackets to use around player names."] = true,
    ["Brackets Use Common Color"] = true,
    ["Toggle using a common color for brackets around player names."] = true,
    ["linkifycommon_name"] = "Linkify Common Messages",
    ["linkifycommon_desc"] = "Linkify Common Messages",
    ["Prat_Playernames: Stored Player Data Cleared"] = true,
    ["tabcomplete_name"] = "Possible Names",
    ["Tab completion : "] = true,
    ["Too many matches (%d possible)"] = true,
    ["Actively Query Player Info"] = true,
    ["Query the server for all player names we do not know. Note: This happpens pretty slowly, and this data is not saved."] = true,
  })
  --@end-debug@]===]

  -- These Localizations are auto-generated. To help with localization
  -- please go to http://www.wowace.com/projects/prat-3-0/localization/


  --@non-debug@
  L:AddLocale("enUS",
  {
	["Actively Query Player Info"] = true,
	Angled = true,
	Brackets = true,
	["Brackets Common Color"] = true,
	["Brackets Use Common Color"] = true,
	Class = true,
	["Color by Level Difference"] = true,
	["Enable Alt-Invite"] = true,
	["Enable Invite Links"] = true,
	["Enable TabComplete"] = true,
	["How to color other player's level."] = true,
	["How to color player's name."] = true,
	["Keep Info"] = true,
	["Keep Lots Of Info"] = true,
	["Keep player information between session for all players except cross-server players"] = true,
	["Keep player information between session, but limit it to friends and guild members."] = true,
	["Let TasteTheNaimbow set the common color for unknown player names."] = true,
	["Level Color Mode"] = true,
	["No additional coloring"] = true,
	None = true,
	["Player Color Mode"] = true,
	["Player name formating options."] = true,
	PlayerNames = true,
	["Prat_Playernames: Stored Player Data Cleared"] = true,
	["Query the server for all player names we do not know. Note: This happpens pretty slowly, and this data is not saved."] = true,
	Random = true,
	["Reset Settings"] = true,
	["Restore default settings, and delete stored character data."] = true,
	["Set common color of unknown player names."] = true,
	["Sets common color of brackets to use around player names."] = true,
	["Sets style of brackets to use around player names."] = true,
	["Show Group"] = true,
	["Show Level"] = true,
	["Show Raid Target Icon"] = true,
	Square = true,
	["Tab completion : "] = true,
	["Toggle group invites by alt-clicking hyperlinked keywords like 'invite'."] = true,
	["Toggle group invites by alt-clicking on player name."] = true,
	["Toggle level showing."] = true,
	["Toggle raid group showing."] = true,
	["Toggle showing the raid target icon which is currently on the player."] = true,
	["Toggle tab completion of player names."] = true,
	["Toggle using a common color for brackets around player names."] = true,
	["Toggle using a common color for unknown player names."] = true,
	["Too many matches (%d possible)"] = true,
	["Unknown Common Color"] = true,
	["Unknown Common Color From TasteTheNaimbow"] = true,
	["Unknown Use Common Color"] = true,
	["Use Channel Color"] = true,
	["Use Player Color"] = true,
	["Use toon name for RealID"] = true,
	coloreverywhere_desc = "Color player names if they appear in the text of the chat message",
	coloreverywhere_name = "Color Names Everywhere",
	hoverhilight_desc = "Hilight chat lines from a specific player when hovering over thier playerlink",
	hoverhilight_name = "Hover Hilighting",
	linkifycommon_desc = "Linkify Common Messages",
	linkifycommon_name = "Linkify Common Messages",
	realidcolor_desc = "RealID Name Coloring",
	realidcolor_name = "RealID Coloring",
	tabcomplete_name = "Possible Names",
}

  )
  L:AddLocale("frFR",
  {
	["Actively Query Player Info"] = "Interroger activement les joueurs",
	Angled = "Chevrons",
	Brackets = "Crochets",
	["Brackets Common Color"] = "Couleur des crochets",
	["Brackets Use Common Color"] = "Couleur des crochets",
	Class = "Classe du joueur",
	["Color by Level Difference"] = "Différence de niveau",
	["Enable Alt-Invite"] = "Invitation avec Alt",
	["Enable Invite Links"] = "Liens d'invitation",
	["Enable TabComplete"] = "Complétion avec Tab",
	["How to color other player's level."] = "Définit la couleur du niveau des autres joueurs.",
	["How to color player's name."] = "Définit la couleur du nom des joueurs.",
	["Keep Info"] = "Garder les info.",
	["Keep Lots Of Info"] = "Garder beaucoup d'info.",
	["Keep player information between session for all players except cross-server players"] = "Garder les informations sur tous les joueurs entre les sessions sauf pour les joueurs inter-serveurs.",
	["Keep player information between session, but limit it to friends and guild members."] = "Garder les informations sur les joueurs entre les sessions, mais seulement pour les amis et membres de la guilde.",
	["Let TasteTheNaimbow set the common color for unknown player names."] = "Laisser TasteTheNaimbow définir la couleur des joueurs inconnus.",
	["Level Color Mode"] = "Couleur des niveaux",
	["No additional coloring"] = "Pas de couleur",
	None = "Aucun",
	["Player Color Mode"] = "Couleur des joueurs",
	["Player name formating options."] = "Options de formatage pour les noms des joueurs.",
	PlayerNames = "Nom des joueurs",
	["Prat_Playernames: Stored Player Data Cleared"] = "Prat_Playernames: Informations des joueurs réinitialisées.",
	["Query the server for all player names we do not know. Note: This happpens pretty slowly, and this data is not saved."] = "Interroge le serveur pour tous les noms de joueurs que nous ne connaissons pas. Note : Cela peut être très lent, et les informations ne sont pas sauvegardées.",
	Random = "Aléatoire",
	["Reset Settings"] = "Réinitialiser",
	["Restore default settings, and delete stored character data."] = "Remets les options par défaut, et supprime toutes les informations enregistrées sur les joueurs.",
	["Set common color of unknown player names."] = "Définit la couleur pour les noms de joueurs inconnus.",
	["Sets common color of brackets to use around player names."] = "Définit la couleur des crochets autour du noms des joueurs.",
	["Sets style of brackets to use around player names."] = "Définit le style des crochets autour du nom des joueurs.",
	["Show Group"] = "Montrer le groupe",
	["Show Level"] = "Montrer le niveau",
	["Show Raid Target Icon"] = "Montrer l'icône de raid",
	Square = "Crochets",
	["Tab completion : "] = "Auto-complétion :",
	["Toggle group invites by alt-clicking hyperlinked keywords like 'invite'."] = "Active/Désactive l'invitation de groupe en faisant Alt+clic sur des mots-clé hyperliens comme 'inviter'.",
	["Toggle group invites by alt-clicking on player name."] = "Active/Désactive l'invitation de groupe en faisant Alt+clic sur le nom d'un joueur.",
	["Toggle level showing."] = "Active/Désactive l'affichage du niveau.",
	["Toggle raid group showing."] = "Active/Désactive l'affichage du groupe de raid.",
	["Toggle showing the raid target icon which is currently on the player."] = "Active/Désactive l'affichage de l'icône de raid qui est sur le joueur.",
	["Toggle tab completion of player names."] = "Active/Désactive l'auto-complétion du nom des joueurs.",
	["Toggle using a common color for brackets around player names."] = "Active/Désactive l'utilisation d'une couleur commune pour les crochets autour du nom des joueurs.",
	["Toggle using a common color for unknown player names."] = "Active/Désactive l'utilisation d'une couleur commune pour les joueurs inconnus.",
	["Too many matches (%d possible)"] = "Trop de résultats (%d possibles)",
	["Unknown Common Color"] = "Couleur pour inconnu",
	-- ["Unknown Common Color From TasteTheNaimbow"] = "",
	["Unknown Use Common Color"] = "Couleur pour inconnu",
	["Use Channel Color"] = "Couleur du canal",
	["Use Player Color"] = "Couleur du joueur",
	-- ["Use toon name for RealID"] = "",
	coloreverywhere_desc = "Colorier le nom des joueurs si ils apparaissent dans le texte des messages.",
	coloreverywhere_name = "Couleur partout",
	-- hoverhilight_desc = "",
	-- hoverhilight_name = "",
	-- linkifycommon_desc = "",
	-- linkifycommon_name = "",
	realidcolor_desc = "Couleur des noms RealID.",
	realidcolor_name = "Couleur RealID",
	tabcomplete_name = "Noms possibles",
}

  )
  L:AddLocale("deDE",
  {
	["Actively Query Player Info"] = "Spielerinformationen aktiv abfragen",
	Angled = "Abgewinkelt",
	Brackets = "Klammern",
	["Brackets Common Color"] = "Standardfarbe der Klammern",
	["Brackets Use Common Color"] = "Klammern verwende die Standardfarbe",
	Class = "Klasse",
	["Color by Level Difference"] = "Entsprechend des Stufenunterschieds einfärben",
	["Enable Alt-Invite"] = "Alt-Einladungen aktivieren",
	["Enable Invite Links"] = "Einladungs-Links aktivieren",
	["Enable TabComplete"] = "TabComplete aktivieren",
	["How to color other player's level."] = "Wie die Stufen anderer Spieler eingefärbt werden sollen.",
	["How to color player's name."] = "Wie die Namen der Spieler eingefärbt werden sollen.",
	["Keep Info"] = "Informationen merken",
	["Keep Lots Of Info"] = "Viele Informationen speichern",
	["Keep player information between session for all players except cross-server players"] = "Spielerinformationen aller Spieler außer Spielern anderer Server zwischen Sitzungen merken.",
	["Keep player information between session, but limit it to friends and guild members."] = "Spielerinformationen zwischen Sitzungen speichern, aber schränke dies ein auf Freunde und Gildenmitglieder.",
	["Let TasteTheNaimbow set the common color for unknown player names."] = "Lasse TasteTheNaimbow die übliche Farbe für unbekannte Spielernamen einstellen.",
	["Level Color Mode"] = "Stufenfarbe-Modus",
	["No additional coloring"] = "Keine zusätzliche Einfärbung",
	None = "Keine",
	["Player Color Mode"] = "Spielerfarbe-Modus",
	["Player name formating options."] = "Formatierungsoptionen für Spielernamen",
	PlayerNames = true,
	["Prat_Playernames: Stored Player Data Cleared"] = "Prat_Playernames: Gespeicherte Spielerdaten gelöscht",
	["Query the server for all player names we do not know. Note: This happpens pretty slowly, and this data is not saved."] = "Alle uns unbekannten Spielernamen beim Server abfragen. Merke: dies passiert ziemlich langsam und diese Daten sind nicht gespeichert.",
	Random = "Zufällig",
	["Reset Settings"] = "Einstellungen zurücksetzen",
	["Restore default settings, and delete stored character data."] = "Standardeinstellungen wiederherstellen und gespeicherte Charakterdaten löschen.",
	["Set common color of unknown player names."] = "Allgemein übliche Farbe bei unbekannten Spielernamen einstellen.",
	["Sets common color of brackets to use around player names."] = "Allgemein übliche Farbe der Klammern bei Spielernamen einstellen.",
	["Sets style of brackets to use around player names."] = "Stil der Klammern bei Spielernamen einstellen.",
	["Show Group"] = "Gruppe anzeigen",
	["Show Level"] = "Stufe anzeigen",
	["Show Raid Target Icon"] = "Schlachtzugsziel-Symbol anzeigen",
	Square = "Quadrat",
	["Tab completion : "] = "Tab-Ergänzung:",
	["Toggle group invites by alt-clicking hyperlinked keywords like 'invite'."] = "Gruppeneinladungen umschalten, indem Hyperlinks von Stichworten wie \"invite\" bei gleichzeitigem Drücken der Alt-Taste angeklickt werden.",
	["Toggle group invites by alt-clicking on player name."] = "Gruppeneinladungen umschalten, indem Spielernamen bei gleichzeitigem Drücken der Alt-Taste angeklickt werden.",
	["Toggle level showing."] = "Stufenanzeige umschalten.",
	["Toggle raid group showing."] = "Schlachtzugsgruppenanzeige umschalten.",
	["Toggle showing the raid target icon which is currently on the player."] = "Anzeige von Schlachtzugsziel-Symbol, welches gegenwärtig dem Spieler zugewiesen ist, umschalten.",
	["Toggle tab completion of player names."] = "Tag-Ergänzung von Spielernamen umschalten.",
	["Toggle using a common color for brackets around player names."] = "Die Verwendung der allgemein üblichen Farbe für Klammern bei Spielernamen umschalten.",
	["Toggle using a common color for unknown player names."] = "Die Verwendung der allgemein üblichen Farbe für unbekannte Spielernamen umschalten.",
	["Too many matches (%d possible)"] = "Zu viele Entsprechungen (%d möglich)",
	["Unknown Common Color"] = "Unbekannte übliche Farbe",
	["Unknown Common Color From TasteTheNaimbow"] = "Unbekannte übliche Farbe von TasteTheNaimbow",
	["Unknown Use Common Color"] = "Unbekannt - übliche Farbe verwenden",
	["Use Channel Color"] = "Kanalfarbe verwenden",
	["Use Player Color"] = "Spielerfarbe verwenden",
	-- ["Use toon name for RealID"] = "",
	coloreverywhere_desc = "Spielernamen einfärben, wenn diese im Text einer Chat-Mitteilung auftreten.",
	coloreverywhere_name = "Namen überall einfärben",
	hoverhilight_desc = "Chat-Zeilen eines bestimmten Spielers hervorheben, wenn die Maus über den Spielerlink gelegt wird.",
	hoverhilight_name = "Schwebendes Hervorheben",
	linkifycommon_desc = "Allgemeine Mitteilungen in Links umwandeln",
	linkifycommon_name = "Allgemeine Mitteilungen in Links umwandeln",
	realidcolor_desc = "RealID Namenseinfärbung",
	realidcolor_name = "RealID Einfärbung",
	tabcomplete_name = "Mögliche Namen",
}

  )
  L:AddLocale("koKR",
  {
	["Actively Query Player Info"] = "플레이어 정보 적극적 수집",
	Angled = "<플레이어>",
	Brackets = "괄호 선택",
	["Brackets Common Color"] = "괄호 색깔",
	["Brackets Use Common Color"] = "괄호에 색깔 사용",
	Class = "직업",
	["Color by Level Difference"] = "레벨 차이에 의한 색깔",
	["Enable Alt-Invite"] = "Alt 초대 켜기",
	["Enable Invite Links"] = "초대 링크 켜기",
	["Enable TabComplete"] = "탭완성 켜기",
	["How to color other player's level."] = "다른 플레이어들의 레벨 색깔 방법",
	["How to color player's name."] = "플레이어 이름 색깔 방법",
	["Keep Info"] = "길드유저 정보 저장",
	["Keep Lots Of Info"] = "모든유저 정보 저장",
	["Keep player information between session for all players except cross-server players"] = "모든유저에 대한 정보를 저장합니다. (다른 서버는 제외)",
	["Keep player information between session, but limit it to friends and guild members."] = "친구와 길드유저에 대한 정보를 저장합니다.",
	["Let TasteTheNaimbow set the common color for unknown player names."] = "모르는 유저에 대한 색깔로 TasteTheNaimBow 애드온의 설정을 사용한다.",
	["Level Color Mode"] = "레벨 색깔 설정",
	["No additional coloring"] = "색깔사용하지 않음",
	None = "없음",
	["Player Color Mode"] = "플레이어 색상 모드",
	["Player name formating options."] = "플레이어 이름 형식 설정",
	PlayerNames = "플레이어 이름",
	["Prat_Playernames: Stored Player Data Cleared"] = "Prat_Playernames: 저장된 플레이어 데이타 초기화",
	["Query the server for all player names we do not know. Note: This happpens pretty slowly, and this data is not saved."] = "알 수 없는 모든 플레이어 이름 정보를 서버에 요청합니다. 주의: 작동 시 느려질 수 있으며, 수집된 정보들은 저장되지 않습니다.",
	Random = "무작위",
	["Reset Settings"] = "설정 초기화",
	["Restore default settings, and delete stored character data."] = "기본 설정을 복구하고 저장된 케릭터 설정을 지웁니다.",
	["Set common color of unknown player names."] = "알 수 없는 플레이어 이름 색상 설정",
	["Sets common color of brackets to use around player names."] = "플레이어 이름 괄호의 일반 색상 설정",
	["Sets style of brackets to use around player names."] = "플레이어 이름 주변 괄호 설정",
	["Show Group"] = "그룹 보이기",
	["Show Level"] = "레벨 보이기",
	["Show Raid Target Icon"] = "전술 아이콘 보이기",
	Square = "사각형",
	["Tab completion : "] = "탭 완성 :",
	["Toggle group invites by alt-clicking hyperlinked keywords like 'invite'."] = "'초대'같은 단어를 Alt-클릭으로 초대하기",
	["Toggle group invites by alt-clicking on player name."] = "플레이어 이름 Alt-클릭으로 초대하기",
	["Toggle level showing."] = "레벨 보이기",
	["Toggle raid group showing."] = "공격대 파티 보이기",
	["Toggle showing the raid target icon which is currently on the player."] = "플레이어에게 지정된 전술 아이콘 보이기",
	["Toggle tab completion of player names."] = "플레이어 이름 탭 완성 켜기",
	["Toggle using a common color for brackets around player names."] = "플레이어 이름 주변 괄호 색상 사용",
	["Toggle using a common color for unknown player names."] = "알 수 없는 플레이어 이름에 일반 색상 사용하기",
	["Too many matches (%d possible)"] = "너무 많은 일치 (%d 가능)",
	["Unknown Common Color"] = "알 수 없는 일반 색상",
	-- ["Unknown Common Color From TasteTheNaimbow"] = "",
	["Unknown Use Common Color"] = "알 수 없는 이름에 색상 사용",
	["Use Channel Color"] = "채널 색상 사용",
	["Use Player Color"] = "플레이어 색상 사용",
	-- ["Use toon name for RealID"] = "",
	coloreverywhere_desc = "채팅 메시지에 나타나는 플레이어 이름에 색상 적용",
	coloreverywhere_name = "모든 곳에서 이름에 색상 사용",
	hoverhilight_desc = "플레이어 이름 위에 마우스 오버 시 채팅 내용을 강조합니다",
	hoverhilight_name = "마우스 오버 강조",
	-- linkifycommon_desc = "",
	-- linkifycommon_name = "",
	-- realidcolor_desc = "",
	-- realidcolor_name = "",
	-- tabcomplete_name = "",
}

  )
  L:AddLocale("esMX",
  {
	-- ["Actively Query Player Info"] = "",
	-- Angled = "",
	-- Brackets = "",
	-- ["Brackets Common Color"] = "",
	-- ["Brackets Use Common Color"] = "",
	-- Class = "",
	-- ["Color by Level Difference"] = "",
	-- ["Enable Alt-Invite"] = "",
	-- ["Enable Invite Links"] = "",
	-- ["Enable TabComplete"] = "",
	-- ["How to color other player's level."] = "",
	-- ["How to color player's name."] = "",
	-- ["Keep Info"] = "",
	-- ["Keep Lots Of Info"] = "",
	-- ["Keep player information between session for all players except cross-server players"] = "",
	-- ["Keep player information between session, but limit it to friends and guild members."] = "",
	-- ["Let TasteTheNaimbow set the common color for unknown player names."] = "",
	-- ["Level Color Mode"] = "",
	-- ["No additional coloring"] = "",
	-- None = "",
	-- ["Player Color Mode"] = "",
	-- ["Player name formating options."] = "",
	-- PlayerNames = "",
	-- ["Prat_Playernames: Stored Player Data Cleared"] = "",
	-- ["Query the server for all player names we do not know. Note: This happpens pretty slowly, and this data is not saved."] = "",
	-- Random = "",
	-- ["Reset Settings"] = "",
	-- ["Restore default settings, and delete stored character data."] = "",
	-- ["Set common color of unknown player names."] = "",
	-- ["Sets common color of brackets to use around player names."] = "",
	-- ["Sets style of brackets to use around player names."] = "",
	-- ["Show Group"] = "",
	-- ["Show Level"] = "",
	-- ["Show Raid Target Icon"] = "",
	-- Square = "",
	-- ["Tab completion : "] = "",
	-- ["Toggle group invites by alt-clicking hyperlinked keywords like 'invite'."] = "",
	-- ["Toggle group invites by alt-clicking on player name."] = "",
	-- ["Toggle level showing."] = "",
	-- ["Toggle raid group showing."] = "",
	-- ["Toggle showing the raid target icon which is currently on the player."] = "",
	-- ["Toggle tab completion of player names."] = "",
	-- ["Toggle using a common color for brackets around player names."] = "",
	-- ["Toggle using a common color for unknown player names."] = "",
	-- ["Too many matches (%d possible)"] = "",
	-- ["Unknown Common Color"] = "",
	-- ["Unknown Common Color From TasteTheNaimbow"] = "",
	-- ["Unknown Use Common Color"] = "",
	-- ["Use Channel Color"] = "",
	-- ["Use Player Color"] = "",
	-- ["Use toon name for RealID"] = "",
	-- coloreverywhere_desc = "",
	-- coloreverywhere_name = "",
	-- hoverhilight_desc = "",
	-- hoverhilight_name = "",
	-- linkifycommon_desc = "",
	-- linkifycommon_name = "",
	-- realidcolor_desc = "",
	-- realidcolor_name = "",
	-- tabcomplete_name = "",
}

  )
  L:AddLocale("ruRU",
  {
	["Actively Query Player Info"] = "Активный запрос инфы о игроке",
	Angled = "Треугольные",
	Brackets = "Скобки",
	["Brackets Common Color"] = "Основной цвет скобок",
	["Brackets Use Common Color"] = "Скобки общего цвета",
	Class = "Класс",
	["Color by Level Difference"] = "Окрашивание по отличию в уровне",
	["Enable Alt-Invite"] = "Включить приглашение с кнопкой Alt",
	["Enable Invite Links"] = "Включить приглашение по ссылкам",
	["Enable TabComplete"] = "Включить TabComplete",
	["How to color other player's level."] = "Как окрашивать уповень игрока.",
	["How to color player's name."] = "Как окрашивать имя игрока.",
	["Keep Info"] = "Хранить информацию",
	["Keep Lots Of Info"] = "Хранить большое количество информации",
	["Keep player information between session for all players except cross-server players"] = "Хранить информацию о всех собеседниках между сессиями за исключением игроков с других серверов",
	["Keep player information between session, but limit it to friends and guild members."] = "Хранить информацию о собеседниках между сессиями, но ограничить этот список только друзьями и членами гильдии.",
	["Let TasteTheNaimbow set the common color for unknown player names."] = "Позволить TasteTheNaimbow установить общий цветдля неизвестных играков.",
	["Level Color Mode"] = "Режим окрашивания уровня",
	["No additional coloring"] = "Отключить дополнительное цвето-выделение",
	None = "Нет",
	["Player Color Mode"] = "Режим цвета игрока",
	["Player name formating options."] = "Настройки форматирования имени собеседника.",
	PlayerNames = "Имя игрока",
	["Prat_Playernames: Stored Player Data Cleared"] = "Prat_Playernames: Информация о собеседниках очищена",
	["Query the server for all player names we do not know. Note: This happpens pretty slowly, and this data is not saved."] = "Запрос сервера для всех неизвестных играков. Заметка: Это происходит дастаточно медленно, и их данные не сохраняются.",
	Random = "Случайно",
	["Reset Settings"] = "Сброс настроек",
	["Restore default settings, and delete stored character data."] = "Восстановить настройки по умолчанию и удалить сохраненную информацию о собеседниках.",
	["Set common color of unknown player names."] = "Выбор цвета, которым будут окрашены неизвестные игроки.",
	["Sets common color of brackets to use around player names."] = "Установить цвет скобок, окружающих имя игрока.",
	["Sets style of brackets to use around player names."] = "Установить стиль скобок вокруг имени собеседника.",
	["Show Group"] = "Показывать группу",
	["Show Level"] = "Показывать уровень",
	["Show Raid Target Icon"] = "Показать иконку цели рейда",
	Square = "Квадратные",
	["Tab completion : "] = "Завершение закладки : ",
	["Toggle group invites by alt-clicking hyperlinked keywords like 'invite'."] = "Вкл/выкл приглашение в группу с помощью alt+клик по ключевому слову типа: 'инвайт'.",
	["Toggle group invites by alt-clicking on player name."] = "Включить режим, в котором можно пригласить игрока в группу щелкнув по его имени  с нажатой клавишей Alt.",
	["Toggle level showing."] = "Вкл/выкл отображения уровня собеседника.",
	["Toggle raid group showing."] = "Вкл/выкл отображения рейдовой группы.",
	["Toggle showing the raid target icon which is currently on the player."] = "Вкл/Выкл отображение иконки цели рейда которой помечен игрок.",
	["Toggle tab completion of player names."] = "Вкл/выкл завершение закладки именами играка.",
	["Toggle using a common color for brackets around player names."] = "Включить окрашивание скобок вокруг имени игрока общим, выбранным цветом.",
	["Toggle using a common color for unknown player names."] = "Включить окрашивание имен всех неизвестных собеседников в общий цвет.",
	["Too many matches (%d possible)"] = "За много совпадение (%d возможных)",
	["Unknown Common Color"] = "Общий цвет неизвестных",
	["Unknown Common Color From TasteTheNaimbow"] = "Общая окраска неизвестных из TasteTheNaimbow",
	["Unknown Use Common Color"] = "Общий цвет для неизвестных",
	["Use Channel Color"] = "Использовать цвет канала",
	["Use Player Color"] = "Использовать цвет игрока",
	-- ["Use toon name for RealID"] = "",
	coloreverywhere_desc = "Окраска текст сообщения в цвет имени игрока, если цвет задан",
	coloreverywhere_name = "Цвет имени везде",
	hoverhilight_desc = "Подсвечивает строки чата от определенных игроков при наведении мышкой на их никнейм.",
	hoverhilight_name = "Подсветка при наведении мышкой",
	linkifycommon_desc = "Общие сообщения с сылками",
	linkifycommon_name = "Общие сообщения с сылками",
	-- realidcolor_desc = "",
	realidcolor_name = "RealID Цвет",
	tabcomplete_name = "Возможные имена",
}

  )
  L:AddLocale("zhCN",
  {
	["Actively Query Player Info"] = "活跃的查询玩家信息",
	Angled = "折角",
	Brackets = "括号",
	["Brackets Common Color"] = "同一颜色括号",
	["Brackets Use Common Color"] = "使用同一颜色括号",
	Class = "职业",
	["Color by Level Difference"] = "彩色的等级差别",
	["Enable Alt-Invite"] = "启用Alt-邀请",
	["Enable Invite Links"] = "启用邀请链接",
	["Enable TabComplete"] = "启用Tab键补全",
	["How to color other player's level."] = "如何着色其他玩家的等级",
	["How to color player's name."] = "如何着色玩家的名称",
	["Keep Info"] = "保持信息",
	["Keep Lots Of Info"] = "保持大量的信息",
	["Keep player information between session for all players except cross-server players"] = "为除跨服玩家外的所有玩家在会话间保持玩家信息",
	["Keep player information between session, but limit it to friends and guild members."] = "在会话间保持玩家信息,但仅限于朋友和公会成员",
	["Let TasteTheNaimbow set the common color for unknown player names."] = "让TasteTheNaimbow(插件)为未知玩家名称设置公共颜色",
	["Level Color Mode"] = "等级着色模式",
	["No additional coloring"] = "无额外着色",
	None = "无",
	["Player Color Mode"] = "玩家着色模式",
	["Player name formating options."] = "玩家名称格式选项",
	PlayerNames = "玩家名称",
	["Prat_Playernames: Stored Player Data Cleared"] = "Prat_玩家名称: 玩家数据存储已清除",
	["Query the server for all player names we do not know. Note: This happpens pretty slowly, and this data is not saved."] = "为所有未知玩家查询服务器,注意:这将非常缓慢,并且数据不会被存储",
	Random = "随机",
	["Reset Settings"] = "重置设置",
	["Restore default settings, and delete stored character data."] = "恢复默认设置并删除已存角色数据",
	["Set common color of unknown player names."] = "设置未知玩家名称共有颜色",
	["Sets common color of brackets to use around player names."] = "设置用来围绕玩家名称的括号颜色",
	["Sets style of brackets to use around player names."] = "设置用来围绕玩家名称的括号类型",
	["Show Group"] = "显示团队",
	["Show Level"] = "显示等级",
	["Show Raid Target Icon"] = "显示团队目标图标",
	Square = "直角",
	["Tab completion : "] = "Tab键补全",
	["Toggle group invites by alt-clicking hyperlinked keywords like 'invite'."] = "组队邀请用alt-点击超链接的关键词如'邀请'",
	["Toggle group invites by alt-clicking on player name."] = "组队邀请用alt-点击玩家名称",
	["Toggle level showing."] = "等级显示",
	["Toggle raid group showing."] = "团队分组显示",
	["Toggle showing the raid target icon which is currently on the player."] = "显示当前玩家的团队目标图标",
	["Toggle tab completion of player names."] = "Tab键补全玩家姓名",
	["Toggle using a common color for brackets around player names."] = "为括号内玩家姓名使用公共颜色",
	["Toggle using a common color for unknown player names."] = "为位置未知玩家名称使用公共颜色",
	["Too many matches (%d possible)"] = "太多的匹配 (%d可能的)",
	["Unknown Common Color"] = "未知公共颜色",
	["Unknown Common Color From TasteTheNaimbow"] = "未知公共颜色自TasteTheNaimbow",
	["Unknown Use Common Color"] = "未知使用公共颜色",
	["Use Channel Color"] = "使用频道颜色",
	["Use Player Color"] = "使用玩家颜色",
	-- ["Use toon name for RealID"] = "",
	coloreverywhere_desc = "彩色显示聊天信息中出现的玩家姓名",
	coloreverywhere_name = "彩色显示姓名在所有地方",
	hoverhilight_desc = "当悬停在玩家链接上时高亮该玩家的聊天语句",
	hoverhilight_name = "悬停高亮",
	linkifycommon_desc = "自助链接公共信息",
	linkifycommon_name = "自助链接公共信息",
	realidcolor_desc = "实名名字颜色", -- Needs review
	realidcolor_name = "实名颜色", -- Needs review
	tabcomplete_name = "可能的名称",
}

  )
  L:AddLocale("esES",
  {
	["Actively Query Player Info"] = "Pedir Información de Jugador Activamente",
	Angled = "Angulo",
	Brackets = "Corchetes",
	["Brackets Common Color"] = "Color Común Corchetes",
	["Brackets Use Common Color"] = "Utilizar Color Común Corchetes",
	Class = "Clase",
	["Color by Level Difference"] = "Color por Diferencia de Nivel",
	["Enable Alt-Invite"] = "Habilitar Alt-Invitar",
	["Enable Invite Links"] = "Habilitar Enlaces Invitar",
	["Enable TabComplete"] = "Habilitar Ficha completa",
	["How to color other player's level."] = "Cómo el color de otro jugador de nivel.",
	["How to color player's name."] = "Cómo el color de nombre del jugador.",
	["Keep Info"] = "Mantener Información",
	["Keep Lots Of Info"] = "Mantener Mucha Información",
	["Keep player information between session for all players except cross-server players"] = "Mantiene información de jugadores entre sesiones para todos los jugadores excepto entre servidores",
	["Keep player information between session, but limit it to friends and guild members."] = "Mantiene información de jugadores entre sesiones, pero lo limita a amigos y miembros de la hermandad.",
	["Let TasteTheNaimbow set the common color for unknown player names."] = "Deje a TasteTheNaimbow establecer el color común para nombres de jugador desconocidos.",
	["Level Color Mode"] = "Modo Color por Nivel",
	["No additional coloring"] = "Sin color adicional",
	None = "Ninguno",
	["Player Color Mode"] = "Modo Color del Jugador",
	["Player name formating options."] = "Opciones de formato del nombre de jugador.",
	PlayerNames = "Nombre del Jugador",
	["Prat_Playernames: Stored Player Data Cleared"] = "Prat_Playernames: Limpiados los Datos de Jugador Guardados",
	["Query the server for all player names we do not know. Note: This happpens pretty slowly, and this data is not saved."] = "Consulta el servidor para todos los nombres de jugador que desconocemos. Nota: esto sucede muy lentamente, y estos datos no se guardan.",
	Random = "Aleatorio",
	["Reset Settings"] = "Restablecer Ajustes",
	["Restore default settings, and delete stored character data."] = "Restablece ajustes por defecto, y eliminar información del jugador guardada.",
	["Set common color of unknown player names."] = "Establece el color común para los nombres de jugadores desconocidos.",
	["Sets common color of brackets to use around player names."] = "Establece el color común de los corchetes a utilizar en torno a los nombres de jugador.",
	["Sets style of brackets to use around player names."] = "Establece el estilo de los corchetes a utilizar en torno a los nombres de jugador.",
	["Show Group"] = "Mostrar Grupo",
	["Show Level"] = "Mostrar Nivel",
	["Show Raid Target Icon"] = "Mostrar Icono Objetivo Banda",
	Square = "Cuadrado",
	["Tab completion : "] = "Finalización de Pestaña : ",
	-- ["Toggle group invites by alt-clicking hyperlinked keywords like 'invite'."] = "",
	["Toggle group invites by alt-clicking on player name."] = "Activa invitar a grupo al hacer alt-click en el nombre del jugador.",
	["Toggle level showing."] = "Alterna mostrar nivel.",
	["Toggle raid group showing."] = "Alterna mostrar grupo de raid.",
	["Toggle showing the raid target icon which is currently on the player."] = "Altterna mostrar el icono de objetivo de banda que está en el jugador.",
	["Toggle tab completion of player names."] = "Alterna la finalización de la pestaña de nombres de jugador.",
	["Toggle using a common color for brackets around player names."] = "Alterna utilizar un color común de corchetes en torno a los nombres de jugador.",
	["Toggle using a common color for unknown player names."] = "Alterna el utilizar un color común para los nombres de jugadores desconocidos.",
	["Too many matches (%d possible)"] = "Demasiadas coincidencias (%d posibles)",
	["Unknown Common Color"] = "Color Común Desconocido",
	["Unknown Common Color From TasteTheNaimbow"] = "Color Común Desconocido de TasteTheNaimbow",
	["Unknown Use Common Color"] = "Desconocido Color de Uso Común",
	["Use Channel Color"] = "Utilizar Color Canal",
	["Use Player Color"] = "Utilizar Color Jugador",
	-- ["Use toon name for RealID"] = "",
	coloreverywhere_desc = "Colorear nombres de jugadores si ellos aparecen en el texto de los mensajes del chat.",
	coloreverywhere_name = "Colorear Nombres Siempre",
	hoverhilight_desc = "Resaltar líneas de chat de un jugador al situarse sobre su enlace de jugador",
	-- hoverhilight_name = "",
	linkifycommon_desc = "Linkify Common Messages",
	linkifycommon_name = "Enlazar Mensajes Comunes",
	-- realidcolor_desc = "",
	-- realidcolor_name = "",
	tabcomplete_name = "Nombres Posibles",
}

  )
  L:AddLocale("zhTW",
  {
	["Actively Query Player Info"] = "主動查詢玩家資訊",
	Angled = "角",
	Brackets = "括號",
	["Brackets Common Color"] = "括號通用色彩",
	["Brackets Use Common Color"] = "括號使用的通用色彩",
	Class = "職業",
	["Color by Level Difference"] = "等級差異色彩",
	["Enable Alt-Invite"] = "啟用 Alt 按鍵邀請",
	["Enable Invite Links"] = "啟用邀請連結",
	["Enable TabComplete"] = "啟用 TabComplete",
	["How to color other player's level."] = "如何為玩家等級著色",
	["How to color player's name."] = "如何為玩家名稱著色",
	["Keep Info"] = "保存資訊",
	["Keep Lots Of Info"] = "保存大量資訊",
	["Keep player information between session for all players except cross-server players"] = "保存此階段所有玩家資訊，除了跨伺服器人物。",
	["Keep player information between session, but limit it to friends and guild members."] = "保存此階段玩家資訊，但限制為好友以及公會成員。",
	-- ["Let TasteTheNaimbow set the common color for unknown player names."] = "",
	["Level Color Mode"] = "等級色彩模式",
	["No additional coloring"] = "無額外著色",
	None = "無",
	["Player Color Mode"] = "玩家色彩模式",
	["Player name formating options."] = "玩家名稱格式化選項。",
	PlayerNames = "玩家名稱",
	["Prat_Playernames: Stored Player Data Cleared"] = "Prat_Playernames：已清除儲存的玩家資料",
	["Query the server for all player names we do not know. Note: This happpens pretty slowly, and this data is not saved."] = "查詢所有此伺服器我們不知道的角色名稱。備註：這個程序相當緩慢且並不會儲存此資料。",
	Random = "隨機",
	["Reset Settings"] = "重置設定",
	["Restore default settings, and delete stored character data."] = "恢復至預設值且刪除儲存的角色資料。",
	["Set common color of unknown player names."] = "設定未知角色的顯示色彩",
	-- ["Sets common color of brackets to use around player names."] = "",
	-- ["Sets style of brackets to use around player names."] = "",
	["Show Group"] = "顯示隊伍編號",
	["Show Level"] = "顯示等級",
	["Show Raid Target Icon"] = "顯示團隊標記",
	Square = "方框",
	["Tab completion : "] = "標籤完成:",
	-- ["Toggle group invites by alt-clicking hyperlinked keywords like 'invite'."] = "",
	-- ["Toggle group invites by alt-clicking on player name."] = "",
	["Toggle level showing."] = "切換等級顯示。",
	["Toggle raid group showing."] = "切換團隊組隊顯示。",
	-- ["Toggle showing the raid target icon which is currently on the player."] = "",
	["Toggle tab completion of player names."] = "切換玩家名稱的標籤完成。",
	-- ["Toggle using a common color for brackets around player names."] = "",
	["Toggle using a common color for unknown player names."] = "切換未知玩家以一般色彩顯示",
	["Too many matches (%d possible)"] = "太多符合 (可能 %d)",
	["Unknown Common Color"] = "未知的文字通用顏色",
	["Unknown Common Color From TasteTheNaimbow"] = "來自TasteTheNaimbow 的未知的文字通用顏色",
	["Unknown Use Common Color"] = "未知的文字使用通用顏色",
	["Use Channel Color"] = "使用頻道文字顏色",
	["Use Player Color"] = "使用腳色名稱文字色彩",
	-- ["Use toon name for RealID"] = "",
	-- coloreverywhere_desc = "",
	coloreverywhere_name = "顏色名字到處",
	-- hoverhilight_desc = "",
	hoverhilight_name = "滑鼠懸停高亮",
	linkifycommon_desc = "製作連結共同的訊息",
	linkifycommon_name = "製作連結共同的訊息",
	realidcolor_desc = "RealID 名稱著色",
	realidcolor_name = "RealID 著色",
	tabcomplete_name = "可能的名稱 ",
}

  )
  --@end-non-debug@

  local module = Prat:NewModule(PRAT_MODULE, "AceEvent-3.0", "AceTimer-3.0")
  module.L = L


  module.Classes = {}
  module.Levels = {}
  module.Subgroups = {}

  local NOP = function(self) return end

  module.OnPlayerDataChanged = NOP


  Prat:SetModuleDefaults(module.name, {
    realm = {
      classes = {},
      levels = {}
    },
    profile = {
      on = true,
      brackets = "Square",
      tabcomplete = true,
      tabcompletelimit = 20,
      level = true,
      levelcolor = "DIFFICULTY",
      subgroup = true,
      showtargeticon = false,
      keep = false,
      keeplots = false,
      colormode = "CLASS",
      realidcolor = "CLASS",
      realidname = false,
      coloreverywhere = true,
      usecommoncolor = true,
      altinvite = false,
      linkinvite = false,
      bracketscommoncolor = true,
      linkifycommon = true,
      bracketscolor = {
        r = 0.85,
        g = 0.85,
        b = 0.85,
        a = 1.0
      },
      useTTN = true,
      usewho = false,
      color = {
        r = 0.65,
        g = 0.65,
        b = 0.65,
        a = 1.0
      },
    }
  })


  Prat:SetModuleInit(module,
    function(self)
    -- Right click - who

      UnitPopupButtons["WHOIS"] = {
        text = "Who Is?",
        dist = 0,
        func = function()
          local dropdownFrame = UIDROPDOWNMENU_INIT_MENU
          local name = dropdownFrame.name

          if name then
            SendWho(name)
          end
        end
      }
      tinsert(UnitPopupMenus["FRIEND"], #UnitPopupMenus["FRIEND"] - 1, "WHOIS");

      Prat:RegisterDropdownButton("WHOIS")
    end)

  module.pluginopts = {}

  Prat:SetModuleOptions(module, {
    name = L["PlayerNames"],
    desc = L["Player name formating options."],
    type = "group",
    plugins = module.pluginopts,
    args = {
      brackets = {
        name = L["Brackets"],
        desc = L["Sets style of brackets to use around player names."],
        type = "select",
        order = 110,
        values = { ["Square"] = L["Square"], ["Angled"] = L["Angled"], ["None"] = L["None"] }
      },
      bracketscommoncolor = {
        name = L["Brackets Use Common Color"],
        desc = L["Toggle using a common color for brackets around player names."],
        type = "toggle",
        order = 111,
      },
      bracketscolor = {
        name = L["Brackets Common Color"],
        desc = L["Sets common color of brackets to use around player names."],
        type = "color",
        order = 112,
        get = "GetColorValue",
        set = "SetColorValue",
        disabled = function(info) return not info.handler.db.profile.bracketscommoncolor end,
      },
      usecommoncolor = {
        name = L["Unknown Use Common Color"],
        desc = L["Toggle using a common color for unknown player names."],
        type = "toggle",
        order = 120,
      },
      color = {
        name = L["Unknown Common Color"],
        desc = L["Set common color of unknown player names."],
        type = "color",
        order = 121,
        get = "GetColorValue",
        set = "SetColorValue",
        disabled = function(info) if not info.handler.db.profile.usecommoncolor then return true else return false
        end
        end,
      },
      useTTN = {
        name = L["Unknown Common Color From TasteTheNaimbow"],
        desc = L["Let TasteTheNaimbow set the common color for unknown player names."],
        type = "toggle",
        order = 122,
        hidden = function(info) if TasteTheNaimbow_Loaded then return false else return true end end,
        disabled = function(info) if not info.handler.db.profile.usecommoncolor then return true else return false
        end
        end,
      },
      colormode = {
        name = L["Player Color Mode"],
        desc = L["How to color player's name."],
        type = "select",
        order = 130,
        values = { ["RANDOM"] = L["Random"], ["CLASS"] = L["Class"], ["NONE"] = L["None"] }
      },
      realidcolor = {
        name = L["realidcolor_name"],
        desc = L["realidcolor_desc"],
        type = "select",
        order = 135,
        values = { ["RANDOM"] = L["Random"], ["CLASS"] = L["Class"], ["NONE"] = L["None"] }
      },
      realidname = {
        name = L["Use toon name for RealID"],
        desc = L["Use toon name for RealID"],
        type = "toggle",
        order = 136,
      },
      levelcolor = {
        name = L["Level Color Mode"],
        desc = L["How to color other player's level."],
        type = "select",
        order = 131,
        values = {
          ["PLAYER"] = L["Use Player Color"],
          ["CHANNEL"] = L["Use Channel Color"],
          ["DIFFICULTY"] = L["Color by Level Difference"],
          ["NONE"] = L["No additional coloring"]
        }
      },
      level = {
        name = L["Show Level"],
        desc = L["Toggle level showing."],
        type = "toggle",
        order = 140,
      },
      subgroup = {
        name = L["Show Group"],
        desc = L["Toggle raid group showing."],
        type = "toggle",
        order = 141,
      },
      showtargeticon = {
        name = L["Show Raid Target Icon"],
        desc = L["Toggle showing the raid target icon which is currently on the player."],
        type = "toggle",
        order = 142,
      },
      tabcomplete = {
        name = L["Enable TabComplete"],
        desc = L["Toggle tab completion of player names."],
        type = "toggle",
        order = 150,
        get = function(info) return info.handler.db.profile.tabcomplete end,
        set = function(info, v) info.handler.db.profile.tabcomplete = v; info.handler:TabComplete(v) end
      },
      altinvite = {
        name = L["Enable Alt-Invite"],
        desc = L["Toggle group invites by alt-clicking on player name."],
        type = "toggle",
        order = 151,
      },
      linkinvite = {
        name = L["Enable Invite Links"],
        desc = L["Toggle group invites by alt-clicking hyperlinked keywords like 'invite'."],
        type = "toggle",
        order = 152,
      },
      keep = {
        name = L["Keep Info"],
        desc = L["Keep player information between session, but limit it to friends and guild members."],
        type = "toggle",
        order = 200,
      },
      keeplots = {
        name = L["Keep Lots Of Info"],
        desc = L["Keep player information between session for all players except cross-server players"],
        type = "toggle",
        order = 201,
        disabled = function(info) return not info.handler.db.profile.keep end,
      },
      usewho = {
        name = L["Actively Query Player Info"],
        desc = L["Query the server for all player names we do not know. Note: This happpens pretty slowly, and this data is not saved."],
        type = "toggle",
        order = 202,
        hidden = function(info)
          if LibStub:GetLibrary("LibWho-2.0", true) then
            return false
          end

          if GetAddOnInfo("LibWho-2.0") then
            return false
          end

          return true
        end
      },
      reset = {
        name = L["Reset Settings"],
        desc = L["Restore default settings, and delete stored character data."],
        type = "execute",
        order = 250,
        func = "resetStoredData"
      },
    }
  })

  function module:OnValueChanged(info, b)
    local field = info[#info]
    if field == "altinvite" or field == "linkinvite" then
      self:SetAltInvite()
    elseif field == "usewho" then
      if b and not LibStub:GetLibrary("LibWho-2.0", true) then
        LoadAddOn("LibWho-2.0")
      end
      self.wholib = b and LibStub:GetLibrary("LibWho-2.0", true)
      self:updateAll()
    elseif field == "coloreverywhere" then
      self:OnPlayerDataChanged(b and UnitName("player") or nil)
    end
  end

  local mt_GuildClass = {}


  function module:OnModuleEnable()
    Prat.RegisterChatEvent(self, "Prat_FrameMessage")
    Prat.RegisterChatEvent(self, "Prat_Ready")

    self:SetAltInvite()

    Prat.RegisterMessageItem("PREPLAYERDELIM", "PLAYER", "before")
    Prat.RegisterMessageItem("POSTPLAYERDELIM", "Ss", "after")

    Prat.RegisterMessageItem("PLAYERTARGETICON", "Ss", "after")

    Prat.EnableProcessingForEvent("CHAT_MSG_GUILD_ACHIEVEMENT")

    Prat.RegisterMessageItem("PLAYERLEVEL", "PREPLAYERDELIM", "before")
    Prat.RegisterMessageItem("PLAYERGROUP", "POSTPLAYERDELIM", "after")

    self:RegisterEvent("FRIENDLIST_UPDATE", "updateFriends")
    self:RegisterEvent("GUILD_ROSTER_UPDATE", "updateGuild")
    self:RegisterEvent("RAID_ROSTER_UPDATE", "updateRaid")
    self:RegisterEvent("PLAYER_LEVEL_UP", "updatePlayerLevel")
    self:RegisterEvent("PARTY_MEMBERS_CHANGED", "updateParty")
    self:RegisterEvent("PLAYER_TARGET_CHANGED", "updateTarget")
    self:RegisterEvent("UPDATE_MOUSEOVER_UNIT", "updateMouseOver")
    self:RegisterEvent("WHO_LIST_UPDATE", "updateWho")
    self:RegisterEvent("CHAT_MSG_SYSTEM", "updateWho") -- for short /who command

    self:RegisterEvent("PLAYER_LEAVING_WORLD", "EmptyDataCache")

    if self.db.profile.usewho then
      if not LibStub:GetLibrary("LibWho-2.0", true) then
        LoadAddOn("LibWho-2.0")
      end
      self.wholib = LibStub:GetLibrary("LibWho-2.0", true)
    end

    self:updatePlayer()
    self.NEEDS_INIT = true

    if IsInGuild() == 1 then
      GuildRoster()
    end

    self:TabComplete(self.db.profile.tabcomplete)

    Prat.RegisterLinkType({ linkid = "invplr", linkfunc = self.Invite_Link, handler = self }, self.name)
    Prat.RegisterLinkType({ linkid = "player", linkfunc = self.Player_Link, handler = self }, self.name)
  end

  function module:OnModuleDisable()
    self:TabComplete(false)
    self:UnregisterAllEvents()
    Prat.UnregisterAllChatEvents(self)
  end


  function module:Prat_Ready()
    self:updateAll()
  end

  local cache = {
    module.Levels,
    module.Classes,
    module.Subgroups
  }


  function module:EmptyDataCache(force)
    for k, v in pairs(cache) do
      wipe(v)
    end

    self:updatePlayer()
    self.NEEDS_INIT = true
    self:OnPlayerDataChanged()
  end


  --[[------------------------------------------------
    Core Functions
  ------------------------------------------------]] --
  function module:updateAll()
    self:updatePlayer()
    self:updateParty()

    if MiniMapBattlefieldFrame.status == "active" then
      self:updateBG()
    else
      self:updateRaid()
    end

    self:updateFriends()

    self.NEEDS_INIT = nil

    self:updateGuild(self.db.profile.keeplots)
  end


  function module:updateGF()
    if IsInGuild() == 1 then GuildRoster() end
    self:updateFriends()
    if MiniMapBattlefieldFrame.status == "active" then
      self:updateBG()
    end
    self:updateWho()
    self:updateGuild()
  end

  function module:updatePlayer()
    local PlayerClass = select(2, UnitClass("player"))
    local Name, Server = UnitName("player")
    self:addName(Name, Server, PlayerClass, UnitLevel("player"), nil, "PLAYER")
  end

  function module:updatePlayerLevel(event, level, hp, mp, talentPoints, str, agi, sta, int, spi)
    local PlayerClass = select(2, UnitClass("player"))
    local Name, Server = UnitName("player")
    self:addName(Name, Server, PlayerClass, level, nil, "PLAYER")
  end


  function module:updateFriends()
    local Name, Class, Level
    for i = 1, GetNumFriends() do
      Name, Level, Class = GetFriendInfo(i) -- name, level, class, area, connected, status
      self:addName(Name, nil, Class, Level, nil, "FRIEND")
    end
  end



  function module:updateGuild()
    if IsInGuild() == 1 then
      GuildRoster()

      local Name, Class, Level, _
      for i = 1, GetNumGuildMembers(true) do
        Name, _, _, Level, _, _, _, _, _, _, Class = GetGuildRosterInfo(i)
        self:addName(Name, nil, Class, Level, nil, "GUILD")
      end
    end
  end

  function module:updateRaid()
    --  self:Debug("updateRaid -->")
    local Name, Class, SubGroup, Level, Server, rank
    local _, zone, online, isDead, role, isML
    for k, v in pairs(self.Subgroups) do
      self.Subgroups[k] = nil
    end
    for i = 1, GetNumGroupMembers() do
      _, rank, SubGroup, Level, _, Class, zone, online, isDead, role, isML = GetRaidRosterInfo(i)
      Name, Server = UnitName("raid" .. i)
      self:addName(Name, Server, Class, Level, SubGroup, "RAID")
    end
  end

  function module:updateParty()
    local Class, Unit, Name, Server, _
    for i = 1, GetNumGroupMembers() do
      Unit = "party" .. i
      _, Class = UnitClass(Unit)
      Name, Server = UnitName(Unit)
      self:addName(Name, Server, Class, UnitLevel(Unit), nil, "PARTY")
    end
  end

  function module:updateTarget()
    local Class, Name, Server
    if not UnitIsPlayer("target") or not UnitIsFriend("player", "target") then
      return
    end
    Class = select(2, UnitClass("target"))
    Name, Server = UnitName("target")
    self:addName(Name, Server, Class, UnitLevel("target"), nil, "TARGET")
  end

  function module:updateMouseOver(event)
    local Class, Name, Server
    if not UnitIsPlayer("mouseover") or not UnitIsFriend("player", "mouseover") then
      return
    end
    Class = select(2, UnitClass("mouseover"))
    Name, Server = UnitName("mouseover")
    self:addName(Name, Server, Class, UnitLevel("mouseover"), nil, "MOUSE")
  end

  function module:updateWho()
    if self.wholib then return end

    local Name, Class, Level, Server, _
    for i = 1, GetNumWhoResults() do
      Name, _, Level, _, _, _, Class = GetWhoInfo(i)
      self:addName(Name, Server, Class, Level, nil, "WHO")
    end
  end

  function module:updateBG()
    for i = 1, GetNumBattlefieldScores() do
      local name, killingBlows, honorKills, deaths, honorGained, faction, rank, race, class, filename, damageDone,
      healingDone = GetBattlefieldScore(i);

      if name then
        local plr, svr = name:match("([^%-]+)%-?(.*)")
        self:addName(plr, svr, class, nil, nil, "BATTLEFIELD")
        self:addName(plr, nil, class, nil, nil, "BATTLEFIELD")
      end
    end
    self:updateRaid()
  end


  function module:resetStoredData()
    self.db.realm.classes = {}
    self.db.realm.levels = {}

    self:EmptyDataCache(true)

    Prat:Print(L["Prat_Playernames: Stored Player Data Cleared"])
  end

  --
  -- Coloring Functions
  --
  local CLR = Prat.CLR
  function CLR:Bracket(text) return self:Colorize(module:GetBracketCLR(), text) end

  function CLR:Common(text) return self:Colorize(module:GetCommonCLR(), text) end

  function CLR:Random(text, seed) return self:Colorize(module:GetRandomCLR(seed), text) end

  function CLR:Class(text, class) return self:Colorize(module:GetClassColor(class), text) end

  local colorFunc = GetQuestDifficultyColor or GetDifficultyColor
  function CLR:Level(text, level, name, class, mode)
    local mode = mode or module.db.profile.levelcolor
    if mode and type(level) == "number" and level > 0 then
      if mode == "DIFFICULTY" then
        local diff = colorFunc(level)
        return self:Colorize(CLR:GetHexColor(CLR:Desaturate(diff)), text)
      elseif mode == "PLAYER" then
        return self:Player(text, name, class)
      end
    end

    return text
  end

  function CLR:Player(text, name, class)
    return self:Colorize(module:GetPlayerCLR(name, class), text)
  end

  local servernames

  function module:addName(Name, Server, Class, Level, SubGroup, Source)
    if Name then
      local nosave
      Source = Source or "UNKNOWN"

      -- Messy negations, but this says dont save data from
      -- sources other than guild or friends unless you enable
      -- the keeplots option
      if Source ~= "GUILD" and Source ~= "FRIEND" and Source ~= "PLAYER" then
        nosave = not self.db.profile.keeplots
      end

      if Server and Server:len() > 0 then
        nosave = true
        servernames = servernames or Prat.Addon:GetModule("ServerNames", true)

        if servernames then
          servernames:GetServerKey(Server)
        end
      end


      Name = Name .. (Server and Server:len() > 0 and ("-" .. Server) or "")

      local changed
      if Level and Level > 0 then
        self.Levels[Name:lower()] = Level
        if ((not nosave) and self.db.profile.keep) then
          self.db.realm.levels[Name:lower()] = Level
        else -- Update it if it exists
          if self.db.realm.levels[Name:lower()] then
            self.db.realm.levels[Name:lower()] = Level
          end
        end

        changed = true
      end
      if Class and Class ~= UNKNOWN then
        self.Classes[Name:lower()] = Class
        if ((not nosave) and self.db.profile.keep) then self.db.realm.classes[Name:lower()] = Class end

        changed = true
      end
      if SubGroup then
        module.Subgroups[Name:lower()] = SubGroup

        changed = true
      end

      if changed then
        self:OnPlayerDataChanged(Name)
      end
    end
  end

  function module:getClass(player)
    return self.Classes[player:lower()] or self.db.realm.classes[player:lower()] or self.db.realm.classes[player]
  end

  function module:getLevel(player)
    return self.Levels[player:lower()] or self.db.realm.levels[player:lower()] or self.db.realm.levels[player]
  end

  function module:getSubgroup(player)
    return self.Subgroups[player:lower()]
  end

  function module:GetData(player, frame)
    local class = self:getClass(player)
    local level = self:getLevel(player)

    if level == 0 then level = nil end
    if class == UNKNOWN then class = nil end

    if self.wholib and not (class and level) then
      local user, cachetime = self.wholib:UserInfo(player, { timeout = 20 })

      if user then
        level = user.Level or level
        class = user.NoLocaleClass or user.Class or class
      end
    end
    return class, level, self:getSubgroup(player)
  end

  function module:GetClassColor(class)
    return CLR:GetHexColor(Prat.GetClassGetColor(class))
  end

  function module:addInfo(Name, Server)
    return
  end



  function module:FormatPlayer(message, Name, frame, class)
    if not Name or Name:len() == 0 then return end



    local storedclass, level, subgroup = self:GetData(Name, frame)
    if class == nil then
      class = storedclass
    end

    -- Add level information if needed
    if level and self.db.profile.level then
      message.PLAYERLEVEL = CLR:Level(tostring(level), level, Name, class)
      message.PREPLAYERDELIM = ":"
    end

    -- Add raid subgroup information if needed
    if subgroup and self.db.profile.subgroup and (GetNumRaidMembers() > 0) then
      message.POSTPLAYERDELIM = ":"
      message.PLAYERGROUP = subgroup
    end

    -- Add raid target icon
    if self.db.profile.showtargeticon then
      local icon = UnitExists(Name) and GetRaidTargetIndex(Name)
      if icon then
        icon = ICON_LIST[icon]

        if icon and icon:len() > 0 then
          -- since you cant have icons in links end the link before the icon
          message.PLAYERTARGETICON = "|h" .. icon .. "0|t"
          message.Ll = ""
        end
      end
    end

    if message.PLAYERLINKDATA and (message.PLAYERLINKDATA:find("BN_") and message.PLAYER ~= UnitName("player")) then
      if self.db.profile.realidcolor == "CLASS" then
        local numFriends = BNGetNumFriends()
        for i = 1, numFriends do
          local _, givenName, surname, toon, id = BNGetFriendInfo(i)

          if id then
            if BNTokenCombineGivenAndSurname(givenName .. surname) == message.PLAYER then

              local _, toonName, client, realmName, _, faction, race, class, _, zoneName, level, gameText,
                broadcastText, broadcastTime = BNGetToonInfo(id)

              if toonName and self.db.profile.realidname then
                message.PLAYER = toonName

                if level and self.db.profile.level then
                  message.PLAYERLEVEL = CLR:Level(tostring(level), tonumber(level), nil, nil, "DIFFICULTY")
                  message.PREPLAYERDELIM = ":"
                end
              end

              message.PLAYER = CLR:Class(message.PLAYER, class)
            end
          end
        end
      elseif self.db.profile.realidcolor == "RANDOM" then
        message.PLAYER = CLR:Random(message.PLAYER, message.PLAYER:lower())
      end

    else
      -- Add the player name in the proper color
      message.PLAYER = CLR:Player(message.PLAYER, Name, class)
    end

    -- Add the correct bracket style and color
    local prof_brackets = self.db.profile.brackets
    if prof_brackets == "Angled" then
      message.pP = CLR:Bracket("<") .. message.pP
      message.Pp = message.Pp .. CLR:Bracket(">")
    elseif prof_brackets == "None" then
    else
      message.pP = CLR:Bracket("[") .. message.pP
      message.Pp = message.Pp .. CLR:Bracket("]")
    end
  end


  --
  -- Prat Event Implementation
  --
  local EVENTS_FOR_RECHECK = {
    ["CHAT_MSG_GUILD"] = module.updateGF,
    -- ["CHAT_MSG_OFFICER"] = module.updateGuild,
    -- ["CHAT_MSG_PARTY"] = module.updateParty,
    -- ["CHAT_MSG_PARTY_LEADER"] = module.updateParty,
    -- ["CHAT_MSG_PARTY_GUIDE"] = module.updateParty,
    -- ["CHAT_MSG_RAID"] = module.updateRaid,
    -- ["CHAT_MSG_RAID_LEADER"] = module.updateRaid,
    -- ["CHAT_MSG_RAID_WARNING"] = module.updateRaid,
    ["CHAT_MSG_BATTLEGROUND"] = module.updateBG,
    ["CHAT_MSG_BATTLEGROUND_LEADER"] = module.updateBG,
    ["CHAT_MSG_SYSTEM"] = module.updateGF,
  }

  local EVENTS_FOR_CACHE_GUID_DATA = {
    CHAT_MSG_PARTY = true,
    CHAT_MSG_PARTY_LEADER = true,
    CHAT_MSG_PARTY_GUIDE = true,
    CHAT_MSG_RAID = true,
    CHAT_MSG_RAID_WARNING = true,
    CHAT_MSG_RAID_LEADER = true,
    CHAT_MSG_BATTLEGROUND = true,
    CHAT_MSG_BATTLEGROUND_LEADER = true,
  }


  function module:MakePlayer(message, name)
    if type(name) == "string" then
      local plr, svr = name:match("([^%-]+)%-?(.*)")
      --     self:Debug("MakePlayer", name, plr, svr)

      message.lL = "|Hplayer:"
      message.PLAYERLINK = name
      message.LL = "|h"
      message.PLAYER = plr
      message.Ll = "|h"

      if svr and strlen(svr) > 0 then
        message.sS = "-"
        message.SERVER = svr
      end
    end
  end


  function module:Prat_FrameMessage(info, message, frame, event)
    local _
    if self.NEEDS_INIT then
      self:updateAll()
    end

    local Name = message.PLAYERLINK or ""
    message.Pp = ""
    message.pP = ""

    -- If there is no playerlink, then we have nothing to do
    if Name:len() == 0 then
      return
    end

    local class, level, subgroup = self:GetData(Name)

    if (class == nil) and message and message.ORG and message.ORG.GUID and message.ORG.GUID:len() > 0 then
      _, class = GetPlayerInfoByGUID(message.ORG.GUID)

      if class ~= nil and EVENTS_FOR_CACHE_GUID_DATA[event] then
        self:addName(Name, message.SERVER, class, level, subgroup, "GUID")
      end
    end
    local fx = EVENTS_FOR_RECHECK[event]
    if fx ~= nil and (level == nil or level == 0) then
      fx(self)
    end

    self:FormatPlayer(message, Name, frame, class)
  end

  function module:GetPlayerCLR(name, class, mode)
    if not mode then mode = module.db.profile.colormode end

    if name and strlen(name) > 0 then
      if class and mode == "CLASS" then
        return self:GetClassColor(class)
      elseif mode == "RANDOM" then
        return self:GetRandomCLR(name)
      else
        return self:GetCommonCLR()
      end
    end
  end

  function module:GetBracketCLR()
    if not self.db.profile.bracketscommoncolor then
      return CLR.COLOR_NONE
    else
      local color = self.db.profile.bracketscolor
      return CLR:GetHexColor(color)
    end
  end

  function module:GetCommonCLR()
    local color = CLR.COLOR_NONE
    if self.db.profile.usecommoncolor then
      if self.db.profile.useTTN and TasteTheNaimbow_Loaded then
        color = TasteTheNaimbowExternalColor(name)
      else
        color = CLR:GetHexColor(self.db.profile.color)
      end
    end
    return color
  end

  function module:GetRandomCLR(Name)
    local hash = 17
    for i = 1, string.len(Name) do
      hash = hash * 37 * string.byte(Name, i);
    end

    local r = math.floor(math.fmod(hash / 97, 255));
    local g = math.floor(math.fmod(hash / 17, 255));
    local b = math.floor(math.fmod(hash / 227, 255));

    if ((r * 299 + g * 587 + b * 114) / 1000) < 105 then
      r = math.abs(r - 255);
      g = math.abs(g - 255);
      b = math.abs(b - 255);
    end

    return string.format("%02x%02x%02x", r, g, b)
  end


  function module:TabComplete(enabled)
    local AceTab = LibStub("AceTab-3.0")

    if enabled then
      servernames = servernames or Prat.Addon:GetModule("ServerNames", true)

      if not AceTab:IsTabCompletionRegistered(L["tabcomplete_name"]) then
        local foundCache = {}
        AceTab:RegisterTabCompletion(L["tabcomplete_name"], nil,
          function(t, text, pos)
            for name in pairs(self.Classes) do
              table.insert(t, name)
            end
          end,
          function(u, cands, ...)
            local candcount = #cands
            if candcount <= self.db.profile.tabcompletelimit then
              local text
              for key, cand in pairs(cands) do
                if servernames then
                  local plr, svr = key:match("([^%-]+)%-?(.*)")

                  cand = CLR:Player(cand, plr, self:getClass(key))

                  if svr then
                    svr = servernames:FormatServer(nil, servernames:GetServerKey(svr))
                    cand = cand .. (svr and ("-" .. svr) or "")
                  end
                else
                  cand = CLR:Player(cand, cand, self:getClass(cand))
                end


                text = text and (text .. ", " .. cand) or cand
              end
              return "   " .. text
            else
              return "   " .. L["Too many matches (%d possible)"]:format(candcount)
            end
          end,
          nil,
          function(name)
            return name:gsub(Prat.MULTIBYTE_FIRST_CHAR, string.upper, 1):match("^[^%-]+")
          end)
      end
    else
      if AceTab:IsTabCompletionRegistered(L["tabcomplete_name"]) then
        AceTab:UnregisterTabCompletion(L["tabcomplete_name"])
      end
    end
  end

  function module:SetAltInvite()
    local enabled = self.db.profile.linkinvite or self.db.profile.altinvite

    if enabled then
      for _, v in pairs(Prat.GetModulePatterns(self)) do
        Prat:RegisterPattern(v, self.name)
      end
    else
      Prat:UnregisterAllPatterns(self.name)
    end
  end

  local EVENTS_FOR_INVITE = {
    ["CHAT_MSG_GUILD"] = true,
    ["CHAT_MSG_OFFICER"] = true,
    ["CHAT_MSG_PARTY"] = true,
    ["CHAT_MSG_RAID"] = true,
    ["CHAT_MSG_RAID_LEADER"] = true,
    ["CHAT_MSG_RAID_WARNING"] = true,
    ["CHAT_MSG_SAY"] = true,
    ["CHAT_MSG_YELL"] = true,
    ["CHAT_MSG_WHISPER"] = true,
    ["CHAT_MSG_CHANNEL"] = true,
  }

  local function Invite(text, ...)
    if module.db.profile.linkinvite then
      return module:ScanForLinks(text, Prat.SplitMessage.PLAYERLINK)
    end
  end

  local INVALID_NAMES = {
    ["meh"] = true,
    ["now"] = true,
    ["plz"] = true,
    ["pls"] = true,
    ["please"] = true,
    ["when"] = true,
    ["group"] = true,
    ["raid"] = true,
    ["grp"] = true,
  }

  local INVALID_NAME_REFERENCE = {
    ["him"] = true,
    ["her"] = true,
    ["them"] = true,
    ["someone"] = true,
  }

  local function InviteSomone(text, name)
    if module.db.profile.linkinvite and name then
      name = name:lower() -- TODO Use UTF8Lib
      if name:len() > 2 and not INVALID_NAMES[name] then
        if INVALID_NAME_REFERENCE[name] then
          return Prat:RegisterMatch(text)
        else
          return module:ScanForLinks(text, name)
        end
      end
    end
  end


  Prat:SetModulePatterns(module, {
    { pattern = "(send%s+invite%s+to%s+" .. Prat.AnyNamePattern .. ")", matchfunc = InviteSomone },
    { pattern = "(invi?t?e?%s+" .. Prat.AnyNamePattern .. ")", matchfunc = InviteSomone },
    { pattern = "(" .. Prat.GetNamePattern("invites?%??") .. ")", matchfunc = Invite },
    { pattern = "(" .. Prat.GetNamePattern("inv%??") .. ")", matchfunc = Invite },
    { pattern = "(초대)", matchfunc = Invite },
    { pattern = "(組%??)$", matchfunc = Invite },
    { pattern = "(組我%??)$", matchfunc = Invite },
  })

  function module:Invite_Link(link, text, button, ...)
    if self.db.profile.linkinvite then
      local name = strsub(link, 8);
      if (name and (strlen(name) > 0)) then
        local begin = string.find(name, "%s[^%s]+$");
        if (begin) then
          name = strsub(name, begin + 1);
        end
        if (button == "LeftButton") then
          InviteUnit(name);
        end
      end
    end

    return false
  end

  function module:Player_Link(link, text, button, ...)
    if self.db.profile.altinvite then
      local name = strsub(link, 8);
      if (name and (strlen(name) > 0)) then
        local begin, nend = string.find(name, "%s*[^%s:]+");
        if (begin) then
          name = strsub(name, begin, nend);
        end
        if (IsAltKeyDown()) then
          InviteUnit(name);
          if ChatEdit_GetActiveWindow() then
            ChatEdit_OnEscapePressed(ChatEdit_GetActiveWindow())
          end
          return false;
        end
      end
    end

    return true
  end

  function module:ScanForLinks(text, name)
    if text == nil then
      return ""
    end

    local enabled = self.db.profile.linkinvite

    if enabled and CanGroupInvite() then

      if Prat.CurrentMessage then
        if EVENTS_FOR_INVITE[Prat.CurrentMessage.EVENT] then
          return self:InviteLink(text, name)
        end
      end
    end

    return text
  end



  function module:InviteLink(link, name)
    return Prat:RegisterMatch(("|cff%s|Hinvplr:%s|h[%s]|h|r"):format("ffff00", name, link))
  end



  return
end) -- Prat:AddModuleToLoad
